package com.example.texted.xml;

import org.w3c.dom.Document;
import org.w3c.dom.Element;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import java.io.StringWriter;

public class CreateXML {
    public static void main(String[] args) throws Exception {
        final DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
        final DocumentBuilder builder = factory.newDocumentBuilder();
        final Document document = builder.newDocument();
//        Element root = document.createElement("languages");
        //创建一个 TransformerFactory，同样通过静态方法调用类的newInstance()方法
//获取一个新的实例
        TransformerFactory transformerFactory = TransformerFactory.newInstance();
//创建一个 Transformer，可以将 XML 文档转换成其他格式
//有异常抛出，用 try catch 捕获
        Transformer transformer = transformerFactory.newTransformer();
//调用 Transformer 的 transform() 方法，传入的参数类型很奇怪
//第一个参数（输入值）是 Source 类型，第二个参数（输出值）是 Result 类型
//第一个参数（输入值）是固定的，由于 Source 是通过 document 来创建的，
//传入匿名对象 new DOMSource()，DOMSource()的参数是Node类型，
//而 Document 也是继承自Node，所以可以传入 document，将 XML 文档作为转换的源
//第二个参数（输出值）可以有2种方法，
//第一个可以转换为字符串，第二个可以转换为文件
//传入匿名对象 new StreamResult()，支持File输出一个文件，也支持 Writer写出
//如果想让XML数据通过网络传播，需要转换成字符串，这就需要传入 Writer
//先创建一个 StringWriter
//有异常抛出，用 try catch 捕获
        StringWriter writer = new StringWriter();
        transformer.transform(new DOMSource(document), new StreamResult(writer));
//最后将 StringWriter 转换为 字符串
//输出只有一行，是纯粹的XML内容，丢失了换行符、缩进符
        System.out.println(writer);
    }
}
